<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>01.类的基本知识</title>
</head>

<body>
  <script>
    /*
    * 总结
    * 1.类中的构造器不是必须写的，要对实例进行一些初始化的操作，如添加指定属性时才写。
    * 2.如果A类继承了B类，且A类中写了构造器，那么A类构造器中的super是必须要调用的
    * 3.类中所定义的方法，都是放在了类的原型对象上，供实例去使用
    * */
    // 创建一个Person类
    class Person {
      //构造器方法
      constructor(name, age) {
        // 构造器中的this是谁？———— 类的实例对象（p1或者p2）
        this.name = name
        this.age = age
      }
      // 一般方法
      speak() {
        // speak方法放在了哪里？———— 类的原型对象上，供实例（p1或者p2）调用
        console.log(`我叫${this.name},我今年${this.age}岁`);
      }
    }
    // 创建一个Student类，继承Person类
    class Student extends Person {
      constructor(name, age, grade) {
        super(name, age)
        this.grade = grade
      }
      // 重写父类的方法
      speak() {
        console.log(`我叫${this.name},我今年${this.age}岁,我上${this.grade}`);
      }
      // 自己独有的方法
      study() {
        console.log('我很努力的学习');
      }
    }

    class Car {
      constructor(name, price) {
        this.name = name
        this.price = price
      }
      // 类中可以直接写赋值语句
      wheel = 4
    }
    let car1 = new Car('奔驰', 600)
    console.log(car1);
    // 创建一个Person的实例对象
    let p1 = new Person('小明', 18)
    let p2 = new Person('小红', 20)
    let s1 = new Student('小刚', 20, '高一')
    console.log(p1);
    console.log(p2);
    console.log(s1);
    p1.speak()
    p2.speak()
    s1.speak()
    s1.study()
  </script>
</body>

</html>